using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;

namespace CapaAccesoDatos.Clases
{
    public class ParametrosCAD
    {

        public static decimal GetMinUnidadTiempo()
        {
            return Convert.ToDecimal(GetParametersByDescripction("MinUnidaddeTiempo"));
        }

        public static int GetMaxTiempoLimiteAntesDeCancelar()
        {
            return Convert.ToInt32(GetParametersByDescripction("TiempoLimiteAntesDeCancelar"));                       
        }

        public static int GetMaxUsoContinuo()
        {
            return Convert.ToInt32(GetParametersByDescripction("MaxUsoContinuo"));
        }

        public static int GetHorizonteDias()
        {
            return Convert.ToInt32(GetParametersByDescripction("HorizonteDias"));
        }

        public static List<String> GetAllDias()
        {
            return GetDiasLaborables();
        }

        public static DateTime[] GetHorasLaborables(String Dia)
        {
            return GetHorasLaborablesByName(Dia);
        }

        public static void UpdateMaxTiempoLimiteAntesDeCancelar(int Id)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Parametros.Nombre + " SET "
                              + Constantes.Tablas.Parametros.Campo_Valor + "='" + Id.ToString()
                              + "' WHERE " + Constantes.Tablas.Parametros.Campo_Descripcion + "='TiempoLimiteAntesDeCancelar'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.UpdateMaxTiempoLimiteAntesDeCancelar()\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
        }

        public static void UpdateMinUnidadTiempo(decimal Value)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Parametros.Nombre + " SET "
                  + Constantes.Tablas.Parametros.Campo_Valor + "='" + Value.ToString()
                  + "' WHERE " + Constantes.Tablas.Parametros.Campo_Descripcion + "='MinUnidaddeTiempo'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.UpdateMinUnidadTiempo()\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
        }

        public static void UpdateMaxUsoContinuo(int Value)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Parametros.Nombre + " SET "
                  + Constantes.Tablas.Parametros.Campo_Valor + "='" + Value.ToString()
                  + "' WHERE " + Constantes.Tablas.Parametros.Campo_Descripcion + "='MaxUsoContinuo'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.UpdateMinUnidadTiempo()\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
        }

        public static void UpdateHorizonteDias(int Value)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Parametros.Nombre + " SET "
               + Constantes.Tablas.Parametros.Campo_Valor + "='" + Value.ToString()
               + "' WHERE " + Constantes.Tablas.Parametros.Campo_Descripcion + "='HorizonteDias'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.UpdateMinUnidadTiempo()\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
        }

        private static List<String> GetDiasLaborables()
        {
            List<String> Retorno = new List<string>();
            String SqlCommand = " SELECT " + Constantes.Tablas.DiasLaborables.Campo_Descripcion  + " FROM " + Constantes.Tablas.DiasLaborables.Nombre +
                                " WHERE " + Constantes.Tablas.DiasLaborables.Activo + " = 'True' ";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader();

                while (Cursor.Read())
                {
                    Retorno.Add(Cursor[Constantes.Tablas.DiasLaborables.Campo_Descripcion].ToString());
                }

                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.GetDiasLaborables(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        private static DateTime[] GetHorasLaborablesByName(String Dia)
        {
            DateTime[] Retorno = new DateTime[2];
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.DiasLaborables.Nombre +
                                " WHERE " + Constantes.Tablas.DiasLaborables.Campo_Descripcion + " = '" + Dia.Trim() + "'";


            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader();

                while (Cursor.Read())
                {
                    Retorno[0] = Convert.ToDateTime(Cursor[Constantes.Tablas.DiasLaborables.Campo_HoraInicio]);
                    Retorno[1] = Convert.ToDateTime(Cursor[Constantes.Tablas.DiasLaborables.Campo_HoraFin]);
                }

                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.GetHorasLaborablesByName(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        private static string GetParametersByDescripction(string Parameter)
        {
            String Retorno = null;
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.Parametros.Nombre +
                                " WHERE " + Constantes.Tablas.Parametros.Campo_Descripcion +
                                " = '" + Parameter + "'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString); 
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);               
            SqlDataReader Cursor = null; 
            SqlTransaction Tx = null;  

            try
            {
                Conexion.Open(); 
                Tx = Conexion.BeginTransaction(); 
                Comando.Transaction = Tx; 
                Cursor = Comando.ExecuteReader(CommandBehavior.SingleRow);

                while (Cursor.Read())
                {
                    Retorno = Convert.ToString(Cursor[Constantes.Tablas.Parametros.Campo_Valor]);
                }

                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: ParametrosCAD.GetParametersByDescripction(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }
    }

}
